﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.IO;

namespace CVCore32.Class.Funciones.Productos
{
    public class Producto
    {

        public static bool ExisteProducto(string CodBarras)
        {
            if (!String.IsNullOrWhiteSpace(CodBarras))
            {
                CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
                Data.electrondbEntities context;
                if (sesion.ServidorWeb)
                {
                    context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
                }
                else
                {
                    context = new Data.electrondbEntities();
                }

                var prod = (from pro in context.Producto
                            where pro.CodBarras == CodBarras
                            select pro.ProductoId).Count();

                if (prod != 0)
                    return true;
                else
                    return false;
            }
            else
            {
                return false;
            }
        }

        public static bool ExisteProducto(int IdProducto)
        {

            CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
            Data.electrondbEntities context;
            if (sesion.ServidorWeb)
            {
                context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
            }
            else
            {
                context = new Data.electrondbEntities();
            }

            var prod = (from pro in context.Producto
                        where pro.ProductoId == IdProducto
                        select pro.ProductoId).Count();

            if (prod != 0)
                return true;
            else
                return false;

        }

        public static bool ExisteMarca(string marca)
        {
            CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
            Data.electrondbEntities context;
            if (sesion.ServidorWeb)
            {
                context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
            }
            else
            {
                context = new Data.electrondbEntities();
            }
            int marcac = (from m in context.Marca
                         where m.Nombre == marca
                         select m.MarcaId).Count();

            if (marcac != 0)
                return true;
            else
                return false;
        }

        public static Data.Producto getProducto(string CodBarras)
        {
            if (!String.IsNullOrWhiteSpace(CodBarras))
            {
                CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
                Data.electrondbEntities context;
                if (sesion.ServidorWeb)
                {
                    context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
                }
                else
                {
                    context = new Data.electrondbEntities();
                }

                Data.Producto prod = (from pro in context.Producto
                                      where pro.CodBarras == CodBarras
                                      select pro).FirstOrDefault();

                return prod;
            }
            else
            {
                throw new Exception("No es posible encontrar el producto.");
            }
        }

        public static Data.Producto getProducto(int IdProducto)
        {

            CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
            Data.electrondbEntities context;
            if (sesion.ServidorWeb)
            {
                context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
            }
            else
            {
                context = new Data.electrondbEntities();
            }

            Data.Producto prod = (from pro in context.Producto
                                  where pro.ProductoId == IdProducto
                                  select pro).FirstOrDefault();

            return prod;

        }

        public static IBindingList getProductosList()
        {
            CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
            Data.electrondbEntities context;
            if (sesion.ServidorWeb)
            {
                context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
            }
            else
            {
                context = new Data.electrondbEntities();
            }

            IBindingList productos;


            productos = ((from p in context.Producto
                          select new
                          {
                              p.ProductoId,
                              p.CodBarras,
                              p.Descripcion,
                              p.Marca
                          }) as IListSource).GetList() as IBindingList;
            return productos;
        }

        public static bool getMarcasTextBox(System.Windows.Forms.TextBox textBox)
        {
            try
            {
                CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
                Data.electrondbEntities context;
                if (sesion.ServidorWeb)
                {
                    context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
                }
                else
                {
                    context = new Data.electrondbEntities();
                }

                var marcas = (from m in context.Marca
                              select m.Nombre).ToList<String>();

                textBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource;
                textBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Append;
                System.Windows.Forms.AutoCompleteStringCollection aColl = new System.Windows.Forms.AutoCompleteStringCollection();

                foreach (string marca in marcas)
                {
                    aColl.Add(marca);
                }

                textBox.AutoCompleteCustomSource = aColl;
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public static void CrearMarca(string nombreMarca) 
        { 
            CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;

            if (sesion.ServidorWeb)
            {
                using (Data.electrondbEntities context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;"))
                {
                    context.Connection.Open();
                    using (var transaction = context.Connection.BeginTransaction())
                    {
                        try
                        {
                            Data.Marca marca = new Data.Marca()
                            {
                                Nombre = nombreMarca
                            };
                            context.AddToMarca(marca);
                            context.SaveChanges();
                            transaction.Commit();
                            
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            throw new Exception(ex.InnerException.ToString());
                        }
                    }
                }
            }
            else
            {
                using (Data.electrondbEntities context = new Data.electrondbEntities())
                {
                    context.Connection.Open();
                    using (var transaction = context.Connection.BeginTransaction())
                    {
                        try
                        {
                            Data.Marca marca = new Data.Marca()
                            {
                                Nombre = nombreMarca
                            };
                            context.AddToMarca(marca);
                            context.SaveChanges();
                            transaction.Commit();

                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            throw new Exception(ex.InnerException.ToString());
                        }
                    }
                }
            }
        }

        public static int getMarcaId(string nombre)
        {
            CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
            Data.electrondbEntities context;
            if (sesion.ServidorWeb)
            {
                context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
            }
            else
            {
                context = new Data.electrondbEntities();
            }

            var marcaid = (from m in context.Marca
                           where m.Nombre == nombre
                           select m.MarcaId).Single();

            return Convert.ToInt32(marcaid);
        }

        public static List<int> CreaProducto(string barras,string desc,int tip, string marc, string comm, int min,double costo, int utilidad,double impuesto, double precventa,int cantidad, System.Windows.Forms.ImageList imgs, int categoria)
        {
            int marcId = getMarcaId(marc);
            CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;

            if (sesion.ServidorWeb)
            {
                using (Data.electrondbEntities context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;"))
                {
                    context.Connection.Open();
                    using (var transaction = context.Connection.BeginTransaction())
                    {
                        try
                        {
                            int ProdId = 0;
                            Data.Producto prod = new Data.Producto()
                            {
                                CodBarras = barras,
                                Descripcion = desc,
                                TipoProducto = tip,
                                FechaCreado = DateTime.Now,
                                Marca = marcId,
                                Comentarios = comm,
                                Minimo = min,
                                IdSubcategoria = categoria
                            };
                            ProdId = prod.ProductoId;
                            Data.Precio prec = new Data.Precio()
                            {
                                Producto = prod.ProductoId,
                                FechaCreado = DateTime.Now,
                                Costo = Convert.ToDecimal(costo),
                                Utilidad = utilidad,
                                Impuesto = 19,
                                PrecioVenta = Convert.ToDecimal(precventa),
                                Cantidad = cantidad,
                                CActual = cantidad,
                                Valido = 0
                            };

                            foreach (System.Drawing.Image img in imgs.Images)
                            {
                                MemoryStream ms = new MemoryStream();
                                img.Save(ms,System.Drawing.Imaging.ImageFormat.Png);

                                Data.ImgProducto imgprod = new Data.ImgProducto()
                                {
                                    ProductoId = prod.ProductoId,
                                    Img = ms.ToArray()
                                };

                                context.AddToImgProducto(imgprod);
                            }
                            

                            context.AddToProducto(prod);
                            context.AddToPrecio(prec);                            


                            context.SaveChanges();                            
                            transaction.Commit();

                            List<int> ids = new List<int>();
                            ids.Add(ProdId);
                            ids.Add(prec.PrecioId);

                            return ids;
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            throw new Exception(ex.InnerException.ToString());
                        }
                    }
                }
            }
            else
            {
                using (Data.electrondbEntities context = new Data.electrondbEntities())
                {
                    context.Connection.Open();
                    using (var transaction = context.Connection.BeginTransaction())
                    {
                        try
                        {
                            int ProdId = 0;
                            Data.Producto prod = new Data.Producto()
                            {
                                CodBarras = barras,
                                Descripcion = desc,
                                TipoProducto = tip,
                                FechaCreado = DateTime.Now,
                                Marca = marcId,
                                Comentarios = comm,
                                Minimo = min,
                                IdSubcategoria = categoria
                            };
                            context.AddToProducto(prod);
                            ProdId = prod.ProductoId;

                            Data.Precio prec = new Data.Precio()
                            {
                                Producto = prod.ProductoId,
                                FechaCreado = DateTime.Now,
                                Costo = Convert.ToDecimal(costo),
                                Utilidad = utilidad,
                                Impuesto = 19,
                                PrecioVenta = Convert.ToDecimal(precventa),
                                Cantidad = cantidad,
                                CActual = cantidad,
                                Valido = 0
                            };

                            foreach (System.Drawing.Image img in imgs.Images)
                            {
                                MemoryStream ms = new MemoryStream();
                                img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

                                Data.ImgProducto imgprod = new Data.ImgProducto()
                                {
                                    ProductoId = prod.ProductoId,
                                    Img = ms.ToArray()
                                };

                                context.AddToImgProducto(imgprod);
                            }
                            

                            context.AddToProducto(prod);
                            context.AddToPrecio(prec);

                            context.SaveChanges();
                            transaction.Commit();

                            List<int> ids = new List<int>();
                            ids.Add(ProdId);
                            ids.Add(prec.PrecioId);

                            return ids;
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            throw new Exception(ex.InnerException.ToString());
                        }
                    }
                }
            }
        }

        public static int GetCantidadDisponible(string CodBarras)
        {
            CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
            Data.electrondbEntities context;
            if (sesion.ServidorWeb)
            {
                context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
            }
            else
            {
                context = new Data.electrondbEntities();
            }

            var cantidad = (from m in context.Precio
                            where 
                            m.Producto1.CodBarras == CodBarras && 
                            m.Valido == 1
                            select m.CActual);

            int acu = 0;
            foreach (int c in cantidad)
            {
                acu = acu + c;
            }
            return Convert.ToInt32(acu);
        }

        public static int GetCantidadDisponible(int IdProducto)
        {
            CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
            Data.electrondbEntities context;
            if (sesion.ServidorWeb)
            {
                context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
            }
            else
            {
                context = new Data.electrondbEntities();
            }

            var cantidad = (from m in context.Precio
                            where
                            m.Producto1.ProductoId == IdProducto &&
                            m.Valido == 1
                            select m.CActual);
            int acu = 0;
            foreach (int c in cantidad)
            {
                acu = acu + c;
            }
            return Convert.ToInt32(acu);
        }
    }
}
